package com.yizhang.newfeatures;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;

/**
 * 常用流
 */
public class StreamTest {
    public static void main(String[] args) {
        List<Integer> list = List.of(1, 2, 3, 4, 6, 5);

        // 合并流
        List<Integer> list1 = List.of(1, 2, 3);
        List<Integer> list2 = List.of(4, 5, 6);
        Stream<Integer> stream1 = list1.stream();
        Stream<Integer> stream2 = list2.stream();
        Stream.concat(stream1, stream2).forEach(System.out::print);
        System.out.println();

        // 截取流
        list.stream().skip(2).limit(2).forEach(System.out::print);
        System.out.println();

        // 条件成立就保留  一旦条件不成立  后面的不要
        list.stream().takeWhile(x -> x < 3).forEach(System.out::print);
        System.out.println();

        // 条件成立就丢弃  一旦条件不成立  后面的全要
        list.stream().dropWhile(x -> x < 3).forEach(System.out::print);
        System.out.println();

        // 查找和判断
        System.out.println(list.stream().filter(x -> x > 7).findFirst().orElse(-1));

        // 在单向流中 findAny和findFirst没区别  findAny在并行流中可能返回其它数据
        list.stream().filter(x -> x < 3).findAny().ifPresent(System.out::println);

        // 只要有1个满足就停止 返回true
        System.out.println(list.stream().anyMatch(x -> x < 3));

        // 只要有1个不满足就停止 返回false
        System.out.println(list.stream().allMatch(x -> x < 3));

        // 只要有1个满足就停止 返回false
        System.out.println(list.stream().noneMatch(x -> x < 2));

        // 排序 (-1:不交换位置  0:不交换位置  1:交换位置)
        list.stream().sorted((a, b) -> a - b).forEach(System.out::print);
        System.out.println();
        list.stream().sorted(Integer::compare).forEach(System.out::print);
        System.out.println();
        list.stream().sorted(Comparator.comparingInt(a -> a)).forEach(System.out::print);
        System.out.println();

        // 倒序
        list.stream().sorted((a, b) -> b - a).forEach(System.out::print);
        System.out.println();

        // 规约
        System.out.println(list.stream().reduce(0, Integer::sum));

    }
}
